﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;

using JA.Negocios;
using System.IO;
using System.Data;

namespace JA.Web.Apresentacao
{
    public partial class CadastroLinkUtil : System.Web.UI.Page
    {
        #region Members
        UsuarioVO usuarioVO = null;
        #endregion
        #region Events
        protected void Page_Load(object sender, EventArgs e)
        {
            usuarioVO = (UsuarioVO)this.Session["userActive"];
            if (usuarioVO == null || !usuarioVO.cadLnk) this.Response.Redirect("~/BackOffice.aspx");

            if (!IsPostBack)
            {
                Util.HabilitarCampos(false, this.panelCad);
            }
        }
        protected void btnSalvar_Click(object sender, EventArgs e)
        {
            LinkUtilVO linkUtilVO = null;
            bool novoRegistro = false;

            try
            {
                if (String.IsNullOrEmpty(this.txtCadIdLinkUtil.Text))
                {
                    linkUtilVO = LinkUtilVO.CreateLinkUtilVO();
                    linkUtilVO.Cadastro = DateTime.Now;
                    linkUtilVO.CadastradoPor = usuarioVO.usuario;

                    novoRegistro = true;
                }
                else
                {
                    linkUtilVO = ModelBO.getLinkUtil(idLinkUtil: Int32.Parse(this.txtCadIdLinkUtil.Text));
                }

                linkUtilVO = CamposToVO(linkUtilVO, getLink: true, getUrl: true, getAtivo: true);
                linkUtilVO.Edicao = DateTime.Now;
                linkUtilVO.EditadoPor = usuarioVO.usuario;

                if (novoRegistro) ModelBO.newLinkUtil(linkUtilVO);
                else ModelBO.setLinkUtil(linkUtilVO);

                Util.ExibeAlert(this, "Registro salvo com sucesso!");

                this.btnPesquisa_Click(null, null);

                Util.LimparCampos(this.panelCad);
                LimparCadastroEdicao();
                HabilitarControles("salvar");
                Util.HabilitarCampos(false, this.panelCad);
            }
            catch { throw; }
        }
        protected void btnPesquisa_Click(object sender, EventArgs e)
        {
            int? idLinkUtil = null;
            string link = null;
            bool ativo = this.chkAtivo.Checked;

            try
            {
                if (!String.IsNullOrEmpty(this.txtIdLinkUtil.Text)) idLinkUtil = Int32.Parse(this.txtIdLinkUtil.Text);
                if (!String.IsNullOrEmpty(this.txtLink.Text)) link = this.txtLink.Text;

                grvResultado_DataSourceBind(ModelBO.getLinkUtils(idLinkUtil, link, ativo));
            }
            catch { throw; }
        }
        protected void btnCancelar_Click(object sender, EventArgs e)
        {
            this.tabLinkUtil.ActiveTab = this.tabPesquisa;

            Util.HabilitarCampos(false, this.panelCad);
            HabilitarControles("cancelar");
        }
        protected void grvResultado_RowDataBound(object sender, GridViewRowEventArgs e)
        {
            if (e.Row.RowType == DataControlRowType.DataRow)
                ((ImageButton)e.Row.FindControl("imgbExcluir")).Attributes.Add("onclick", "return confirma_exclusao();");
        }
        protected void imgbVisualizar_Click(object sender, ImageClickEventArgs e)
        {
            LinkUtilVO linkUtilVO = null;
            int idLinkUtil = 0;

            try
            {
                idLinkUtil = Int32.Parse(((ImageButton)sender).CommandArgument);
                linkUtilVO = ModelBO.getLinkUtil(idLinkUtil);

                VOToCampos(linkUtilVO, true, true, true, true, true, true, true, true);
                this.tabLinkUtil.ActiveTab = this.tabCadastro;
                HabilitarControles("visualizar");
            }
            catch { throw; }
        }
        protected void btnEditar_Click(object sender, EventArgs e)
        {
            Util.HabilitarCampos(true, this.panelCad);
            HabilitarControles("editar");
            this.txtCadLink.Focus();
        }
        protected void btnNovo_Click(object sender, EventArgs e)
        {
            Util.LimparCampos(this.panelCad);
            LimparCadastroEdicao();

            Util.HabilitarCampos(true, this.panelCad);
            HabilitarControles("editar");

            this.txtCadLink.Focus();
        }
        protected void btnExcluir_Click(object sender, EventArgs e)
        {
            LinkUtilVO linkUtilVO = null;

            try
            {
                linkUtilVO = LinkUtilVO.CreateLinkUtilVO(idLinkUtil: Int32.Parse(this.txtCadIdLinkUtil.Text));
                ModelBO.delLinkUtil(linkUtilVO);

                Util.ExibeAlert(this, "Registro excluído com sucesso!");

                this.btnPesquisa_Click(null, null);

                Util.LimparCampos(this.panelCad);
                LimparCadastroEdicao();

                HabilitarControles("salvar");
            }
            catch { throw; }
        }
        #endregion

        #region Methods
        private LinkUtilVO CamposToVO(LinkUtilVO linkUtilVO, bool getId = false, bool getLink = false, bool getUrl = false, bool getAtivo = false, bool getCadastro = false, bool getCadastradoPor = false, bool getEdicao = false, bool getEditadoPor = false)
        {
            if (getId) linkUtilVO.IdLinkUtil = this.txtCadIdLinkUtil.Text.ToInt32();
            if (getLink) linkUtilVO.Link = this.txtCadLink.Text;
            if (getUrl) linkUtilVO.Url = this.txtCadUrl.Text;
            if (getAtivo) linkUtilVO.Ativo = this.chkCadAtivo.Checked;
            if (getCadastro) linkUtilVO.Cadastro = this.ltDataCadastro.Text.ToDateTime();
            if (getCadastradoPor) linkUtilVO.CadastradoPor = this.ltCadastradoPor.Text;
            if (getEdicao) linkUtilVO.Edicao = this.ltDataEdicao.Text.ToDateTime();
            if (getEditadoPor) linkUtilVO.EditadoPor = this.ltEditadoPor.Text;
            return linkUtilVO;
        }
        private void VOToCampos(LinkUtilVO linkUtilVO, bool setId = false, bool setLink = false, bool setUrl = false, bool setAtivo = false, bool setCadastro = false, bool setCadastradoPor = false, bool setEdicao = false, bool setEditadoPor = false)
        {
            if (setId) this.txtCadIdLinkUtil.Text = linkUtilVO.IdLinkUtil.ToString();
            if (setLink) this.txtCadLink.Text = linkUtilVO.Link;
            if (setUrl) this.txtCadUrl.Text = linkUtilVO.Url;
            if (setAtivo) this.chkCadAtivo.Checked = linkUtilVO.Ativo;
            if (setCadastro) this.ltDataCadastro.Text = linkUtilVO.Cadastro.ToShortDateString();
            if (setCadastradoPor) this.ltCadastradoPor.Text = linkUtilVO.CadastradoPor;
            if (setEdicao) this.ltDataEdicao.Text = linkUtilVO.Edicao.ToShortDateString();
            if (setEditadoPor) this.ltEditadoPor.Text = linkUtilVO.EditadoPor;
        }
        private void LimparCadastroEdicao()
        {
            new List<Literal> { this.ltCadastradoPor, this.ltDataCadastro, this.ltDataEdicao, this.ltEditadoPor }
                .ForEach(lt => lt.Text = "");
        }
        private void HabilitarControles(string padrao)
        {
            switch (padrao.ToLower())
            {
                case "salvar":
                    this.btnNovo.Enabled = true;
                    this.btnEditar.Enabled = this.btnExcluir.Enabled = this.btnSalvar.Enabled = false;
                    break;

                case "cancelar":
                    this.btnNovo.Enabled = true;
                    this.btnSalvar.Enabled = false;
                    this.btnEditar.Enabled = this.btnExcluir.Enabled = !String.IsNullOrEmpty(this.txtCadIdLinkUtil.Text);
                    break;

                case "visualizar":
                    this.btnEditar.Enabled = this.btnExcluir.Enabled = true;
                    this.btnNovo.Enabled = false;
                    break;

                case "editar":
                    this.btnSalvar.Enabled = true;
                    this.txtCadIdLinkUtil.Enabled = this.btnEditar.Enabled = this.btnExcluir.Enabled = this.btnNovo.Enabled = false;
                    break;
            }

        }
        private void grvResultado_DataSourceBind(List<LinkUtilVO> source)
        {
            this.grvResultado.DataSource = source;
            this.grvResultado.DataBind();
        }
        #endregion
    }

    public static class Extensions
    {
        public static int ToInt32(this string number) { return Int32.Parse(number); }
        public static DateTime ToDateTime(this string date) { return DateTime.Parse(date); }
    }
}